/*
 *  $Id: TypedArgPhrasePart.cs 1182 2010-11-10 16:23:57Z thenn.erannor $
 *	This file is a part of Ragima CCG.
 *	(C) 2008-2010 Ragima development group.
 *
 *	Licensed under the terms of the GNU GPL License version 2.
 *
 */

namespace Ragima.Languages.PhraseParts {
    /// <summary>
    /// Часть фразы с типизированным аргументом.
    /// </summary>
    public abstract class TypedArgPhrasePart<T> : ArgPhrasePart {
        public TypedArgPhrasePart(int argNum) : base(argNum) {
        }

        /// <summary>
        /// Строит типизированный аргумент как часть фразы.
        /// </summary>
        protected abstract void BuildArg(PhraseBuilder builder, T arg);

        protected override void BuildArg(PhraseBuilder builder, object arg) {
            if (arg is T)
                BuildArg(builder, (T) arg);
        }

        /// <summary>
        /// Получает объект для хинта к части фразы по типизированному аргументу.
        /// </summary>
        protected virtual object GetHintObject(T arg) {
            return null;
        }

        protected override object GetHintObject(object arg) {
            return arg is T ? GetHintObject((T) arg) : null;
        }
    }
}
